package new_article_service

import (
	"shop/internal/models"
	"shop/internal/models/vo"
	"shop/pkg/global"
	"strings"
	"time"
)

type NewArticle struct {
	Id       int64
	Title    string
	CateID   int64
	Author   string
	Image    string
	Synopsis string
	Sontent  string
	Visit    int
	Sort     int
	Url      string
	Status   int

	IsDel int

	PageNum  int
	PageSize int

	M   *models.NewArticle
	Ids []int64
}

func (d *NewArticle) Get() vo.ResultList {
	var data models.NewArticle
	err := global.Db.Model(&models.NewArticle{}).Where("id = ?", d.Id).First(&data).Error
	if err != nil {
		global.LOG.Error(err)
	}
	return vo.ResultList{Content: data, TotalElements: 0}
}

func (d *NewArticle) GetAll() vo.ResultList {

	maps := make(map[string]interface{})

	if d.Title != "" {
		//maps["title"] = d.Title
		maps["title_like"] = "%" + d.Title + "%" // 添加 _like 后缀和通配符
	}
	if d.IsDel != -1 {
		maps["is_del"] = d.IsDel
	}
	total, list := models.GetAllArticle(d.PageNum, d.PageSize, maps)
	return vo.ResultList{Content: list, TotalElements: total}
}

func (d *NewArticle) Insert() error {

	// 转义HTML标签，使其作为纯文本存储
	// 清理和转义内容
	d.M.Content = d.sanitizeContent(d.M.Content)

	// 设置创建时间和更新时间
	now := time.Now()
	d.M.CreateTime = now
	d.M.UpdateTime = now
	return models.AddnewArticle(d.M)
}

// 转义HTML标签，使其在页面上显示为源代码
func (d *NewArticle) sanitizeContent(content string) string {

	// 1. 移除或替换分号（临时解决方案）
	// 紧急修复：完全移除所有分号

	// 清理所有字段
	d.M.Content = strings.ReplaceAll(d.M.Content, ";", "")

	// 转义其他SQL敏感字符
	// content = strings.ReplaceAll(content, "'", "''")
	// content = strings.ReplaceAll(content, `"`, `\"`)
	// content = strings.ReplaceAll(content, "\\", "\\\\")
	// 1. 转义HTML
	//content = html.EscapeString(content)

	// 2. 移除或替换可能引起SQL问题的字符
	//content = strings.ReplaceAll(content, ";", "；") // 中文分号

	// 3. 限制内容长度（根据需要）
	if len(content) > 65535 { // MySQL TEXT字段限制
		content = content[:65535]
	}

	return content
}

func (d *NewArticle) Save() error {
	// 设置创建时间和更新时间
	// 保存原始的创建时间
	//originalCreateTime := d.M.CreateTime //旧的时间
	//fmt.Println("原始创建时间:", originalCreateTime)
	now := time.Now()
	//d.M.CreateTime = originalCreateTime
	d.M.UpdateTime = now
	return models.UpdateByNewArticle(d.M)
}

func (d *NewArticle) Delete() error {
	return models.DelByNewArticle(d.Ids)
}
